home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 2 / Meeting Pearls Vol. II (1995)(GTI - Schatztruhe)[!].iso / Pearls / dev / Oberon_Sources / OOP_in_Oberon-2 / GraphicFrames0.mod < prev    next >
Text File  |  1993-01-13  |  3KB  |  73 lines

  1. MODULE GraphicFrames0;        (*HM Mar-25-92*)
  2. IMPORT OS, Viewers0, Shapes0;
  3. TYPE
  4.         Frame* = POINTER TO FrameDesc;
  5.         FrameDesc* = RECORD (Viewers0.FrameDesc)
  6.                 orgX*, orgY*: INTEGER;  (*origin*)
  7.                 graphic*: Shapes0.Graphic  (*shapes in this frame*)
  8.         END;
  9. PROCEDURE (f: Frame) InvertBlock* (x, y, w, h: INTEGER);
  10. BEGIN INC(x, f.x + f.orgX); INC(y, f.y + f.orgY);
  11.         IF x < f.x THEN DEC(w, f.x - x); x := f.x END;
  12.         IF x + w > f.x + f.w THEN w := f.x + f.w - x END;
  13.         IF y < f.y THEN DEC(h, f.y - y); y := f.y END;
  14.         IF y + h > f.y + f.h THEN h := f.y + f.h - y END;
  15.         IF (w > 0) & (h > 0) THEN OS.InvertBlock(x, y, w, h) END
  16. END InvertBlock;
  17. PROCEDURE (f: Frame) Draw*;
  18. BEGIN OS.FadeCursor;
  19.         OS.EraseBlock(f.x, f.y, f.w, f.h);
  20.         f.graphic.Draw(f)
  21. END Draw;
  22. PROCEDURE (f: Frame) Modify* (y: INTEGER);
  23. BEGIN f.Modify^ (y); f.Draw
  24. END Modify;
  25. PROCEDURE (f: Frame) HandleMouse* (x, y: INTEGER; buttons: SET);
  26.         VAR w, h, dx, dy: INTEGER; obj: OS.Object; s: Shapes0.Shape; changed: BOOLEAN;
  27.                 PROCEDURE Track(VAR x, y, w, h, dx, dy: INTEGER; VAR buttons: SET);
  28.                         VAR b: SET; x1, y1: INTEGER;
  29.                 BEGIN
  30.                         REPEAT OS.GetMouse(b, x1, y1); buttons := buttons + b; OS.DrawCursor(x1, y1) UNTIL b = {};
  31.                         dx := x1 - x; dy := y1 - y; w := ABS(dx); h := ABS(dy);
  32.                         IF x1 < x THEN x := x1 END;
  33.                         IF y1 < y THEN y := y1 END;
  34.                         DEC(x, f.x + f.orgX); DEC(y, f.y + f.orgY) (*convert to frame coordinates*)
  35.                 END Track;
  36. BEGIN changed := FALSE;
  37.         IF OS.left IN buttons THEN Track(x, y, w, h, dx, dy, buttons);
  38.                 (*generate new shape with type curShape*)
  39.                 OS.NameToObj(Shapes0.curShape, obj);
  40.                 IF obj # NIL THEN s := obj(Shapes0.Shape); s.SetBox(x, y, w, h); f.graphic.Insert(s) END
  41.         ELSIF OS.middle IN buttons THEN Track(x, y, w, h, dx, dy, buttons);
  42.                 IF OS.left IN buttons THEN (*MM+ML click: move selected figures*)
  43.                         f.graphic.MoveSelected(dx, dy)
  44.                 ELSE (*MM click: move origin*)
  45.                         INC(f.orgX, dx); INC(f.orgY, dy); f.Draw
  46.                 END
  47.         ELSIF OS.right IN buttons THEN f.Neutralize; Track(x, y, w, h, dx, dy, buttons);
  48.                 f.graphic.SetSelection(x, y, w, h);
  49.                 IF OS.left IN buttons THEN (*MR+ML click: delete selected shapes*)
  50.                         f.graphic.DeleteSelected
  51.                 END
  52.         END
  53. END HandleMouse;
  54. PROCEDURE (f: Frame) Neutralize*;
  55. BEGIN f.graphic.Neutralize
  56. END Neutralize;
  57. PROCEDURE (f: Frame) Handle* (VAR m: OS.Message);
  58. BEGIN
  59.         WITH m: Shapes0.NotifyChangeMsg DO
  60.                 IF f.graphic = m.g THEN f.Draw END
  61.         ELSE
  62.         END
  63. END Handle;
  64. PROCEDURE New* (graphic: Shapes0.Graphic): Frame;
  65.         VAR f: Frame;
  66. BEGIN NEW(f); f.graphic := graphic; f.orgX := 0; f.orgY := 0; RETURN f
  67. END New;
  68. PROCEDURE (f: Frame) Copy* (): Viewers0.Frame;
  69.         VAR f1: Frame;
  70. BEGIN f1 := New(f.graphic); f1.orgX := f.orgX; f1.orgY := f.orgY; RETURN f1
  71. END Copy;
  72. END GraphicFrames0.
  73.